package com.youdianstar.app.util;

import android.view.View;

import androidx.camera.view.PreviewView;
import androidx.fragment.app.FragmentActivity;

import com.google.zxing.Result;
import com.king.zxing.CameraScan;
import com.king.zxing.DecodeConfig;
import com.king.zxing.DecodeFormatManager;
import com.king.zxing.DefaultCameraScan;
import com.king.zxing.ViewfinderView;
import com.king.zxing.analyze.MultiFormatAnalyzer;

/**
 * File: ScanHelperEx
 * Author: 82149 Create: 2021/10/27 17:04
 * Changes (from 2021/10/27)
 * --------------------------------------------------
 * description: ZxingLite 扫码辅助
 * ---------------------------------------------------
 */
public class ScanHelperEx implements CameraScan.OnScanResultCallback {
    public interface OnResultCallback {
        void onResultCallback(String result);
    }

    private FragmentActivity activity;

    private CameraScan mCameraScan;
    protected PreviewView previewView;
    protected ViewfinderView viewfinderView;
    protected View ivFlashlight;

    @Override
    public boolean onScanResultCallback(Result result) {
        if (null != result && result.getText() != null) {
            if (null != onResultCallback) onResultCallback.onResultCallback(result.getText());
        }
        return true;
    }

    @Override
    public void onScanResultFailure() {

    }

    /**
     * 扫码回调
     */
    private OnResultCallback onResultCallback;

    private boolean isVerify = false;

    public ScanHelperEx setOnResultCallback(OnResultCallback onResultCallback) {
        this.onResultCallback = onResultCallback;
        return this;
    }

    public ScanHelperEx init(FragmentActivity context, PreviewView previewView, ViewfinderView viewfinderView, View ivFlashlight) {
        this.activity = context;
        this.previewView = previewView;
        this.viewfinderView = viewfinderView;
        this.ivFlashlight = ivFlashlight;
        initCameraScan();
        return this;
    }

    /**
     * 初始化CameraScan
     */
    private void initCameraScan() {
        mCameraScan = new DefaultCameraScan(activity, previewView);
        //初始化解码配置
        DecodeConfig decodeConfig = new DecodeConfig();
        decodeConfig.setHints(DecodeFormatManager.TWO_DIMENSIONAL_HINTS)//设置解码
                .setSupportVerticalCode(true)//设置是否支持扫垂直的条码 （增强识别率，相应的也会增加性能消耗）
                .setSupportLuminanceInvert(true)//设置是否支持识别反色码，黑白颜色反转（增强识别率，相应的也会增加性能消耗）
                .setAreaRectRatio(0.8f)//设置识别区域比例，默认0.8，设置的比例最终会在预览区域裁剪基于此比例的一个矩形进行扫码识别
//                .setAreaRectVerticalOffset(0)//设置识别区域垂直方向偏移量，默认为0，为0表示居中，可以为负数
//                .setAreaRectHorizontalOffset(0)//设置识别区域水平方向偏移量，默认为0，为0表示居中，可以为负数
                .setFullAreaScan(true);//设置是否全区域识别，默认false

        mCameraScan.setPlayBeep(false)//设置是否播放音效，默认为false
                .setVibrate(true)//设置是否震动，默认为false
//                .setCameraConfig(new CameraConfig())//设置相机配置信息，CameraConfig可覆写options方法自定义配置
//                .setCameraConfig(new ResolutionCameraConfig(activity))//设置CameraConfig，可以根据自己的需求去自定义配置
                .setNeedAutoZoom(true)//二维码太小时可自动缩放，默认为false
                .setNeedTouchZoom(true)//支持多指触摸捏合缩放，默认为true
                .setDarkLightLux(45f)//设置光线足够暗的阈值（单位：lux），需要通过{@link #bindFlashlightView(View)}绑定手电筒才有效
                .setBrightLightLux(100f)//设置光线足够明亮的阈值（单位：lux），需要通过{@link #bindFlashlightView(View)}绑定手电筒才有效
                .bindFlashlightView(ivFlashlight)//绑定手电筒，绑定后可根据光线传感器，动态显示或隐藏手电筒按钮
                .setAnalyzer(new MultiFormatAnalyzer(decodeConfig))//设置分析器,DecodeConfig可以配置一些解码时的配置信息，如果内置的不满足您的需求，你也可以自定义实现，
                .setAnalyzeImage(true);//设置是否分析图片，默认为true。如果设置为false，相当于关闭了扫码识别功能
        if (null != onResultCallback)
            mCameraScan.setOnScanResultCallback(this);
    }

    public boolean isVerifyData(){
        return isVerify;
    }

    /**
     * 设置验证扫码值
     *
     * @param isVerify
     */
    public void setVerify(boolean isVerify) {
        this.isVerify = isVerify;
    }

    /**
     * 开启相机预览
     * api 会根据配置自行分析图片
     */
    public void startScan() {
        if (null != mCameraScan)
            mCameraScan.startCamera();
    }

    /**
     * 重启扫码
     */
    public void reStartScan() {
        isVerify = false;
        if (null != mCameraScan) {
            mCameraScan.setAnalyzeImage(true);
        }
    }

    /**
     * 停止扫描
     * 停止分析图片
     */
    public void stopScan() {
        if (null != mCameraScan)
            mCameraScan.setAnalyzeImage(false);
    }

    /**
     * 释放相机
     * Activity onDestroy
     */
    public void releaseCamera() {
        if (mCameraScan != null) {
            mCameraScan.release();
        }
    }

    /**
     * 闪光灯切换
     *
     * @param isOpen
     */
    public void switchLight(boolean isOpen) {
        if (null != mCameraScan)
            mCameraScan.enableTorch(isOpen);
    }

}
